Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Displaying Raw • Download


meshchatx/src/backend/database/contacts.py a9cc4b996b8da8ff414e305825f372ca12dc138d (a9cc4b99) Text, 6.20 KB

T8b949e# SPDX-License-Identifier: 0BSD

Tff7b72from T7ee787.T7ee787provider Tff7b72import Te6edf3DatabaseProvider


Tff7b72class T56d364ContactsDAOTb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3providerTb4b4b4: Te6edf3DatabaseProviderTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffprovider Tff7b72= Te6edf3provider

Tff7b72def Td2a8ffadd_contactTb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3nameTb4b4b4,
Te6edf3remote_identity_hashTb4b4b4,
Te6edf3lxmf_addressTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3lxst_addressTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3preferred_ringtone_idTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3custom_imageTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3is_telemetry_trustedTff7b72=T79c0ff0Tb4b4b4,
Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffproviderTff7b72.Td2a8ffexecuteTb4b4b4(
T8b949e"""
INSERT INTO contacts (name, remote_identity_hash, lxmf_address, lxst_address, preferred_ringtone_id, custom_image, is_telemetry_trusted)
VALUES (?, ?, ?, ?, ?, ?, ?)
ON CONFLICT(remote_identity_hash) DO UPDATE SET
name = EXCLUDED.name,
lxmf_address = COALESCE(EXCLUDED.lxmf_address, contacts.lxmf_address),
lxst_address = COALESCE(EXCLUDED.lxst_address, contacts.lxst_address),
preferred_ringtone_id = EXCLUDED.preferred_ringtone_id,
custom_image = EXCLUDED.custom_image,
is_telemetry_trusted = EXCLUDED.is_telemetry_trusted,
updated_at = CURRENT_TIMESTAMP
"""Tb4b4b4,
Tb4b4b4(
Te6edf3nameTb4b4b4,
Te6edf3remote_identity_hashTb4b4b4,
Te6edf3lxmf_addressTb4b4b4,
Te6edf3lxst_addressTb4b4b4,
Te6edf3preferred_ringtone_idTb4b4b4,
Te6edf3custom_imageTb4b4b4,
Te6edf3is_telemetry_trustedTb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)

Tff7b72def Td2a8ffget_contactsTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3searchTff7b72=Tff7b72NoneTb4b4b4, Te6edf3limitTff7b72=T79c0ff100Tb4b4b4, Te6edf3offsetTff7b72=T79c0ff0Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3searchTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffproviderTff7b72.Td2a8fffetchallTb4b4b4(
T8b949e"""
SELECT * FROM contacts
WHERE name LIKE ? OR remote_identity_hash LIKE ? OR lxmf_address LIKE ? OR lxst_address LIKE ?
ORDER BY name ASC LIMIT ? OFFSET ?
"""Tb4b4b4,
Tb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ff%Tffd700{Te6edf3searchTffd700}Ta5d6ff%Ta5d6ff"Tb4b4b4,
Ta5d6fffTa5d6ff"Ta5d6ff%Tffd700{Te6edf3searchTffd700}Ta5d6ff%Ta5d6ff"Tb4b4b4,
Ta5d6fffTa5d6ff"Ta5d6ff%Tffd700{Te6edf3searchTffd700}Ta5d6ff%Ta5d6ff"Tb4b4b4,
Ta5d6fffTa5d6ff"Ta5d6ff%Tffd700{Te6edf3searchTffd700}Ta5d6ff%Ta5d6ff"Tb4b4b4,
Te6edf3limitTb4b4b4,
Te6edf3offsetTb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72return Tff7b72selfTff7b72.Td2a8ffproviderTff7b72.Td2a8fffetchallTb4b4b4(
Ta5d6ff"Ta5d6ffSELECT * FROM contacts ORDER BY name ASC LIMIT ? OFFSET ?Ta5d6ff"Tb4b4b4,
Tb4b4b4(Te6edf3limitTb4b4b4, Te6edf3offsetTb4b4b4)Tb4b4b4,
Tb4b4b4)

Tff7b72def Td2a8ffget_contacts_countTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3searchTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3searchTb4b4b4:
Te6edf3row Tff7b72= Tff7b72selfTff7b72.Td2a8ffproviderTff7b72.Td2a8fffetchoneTb4b4b4(
T8b949e"""
SELECT COUNT(*) as n FROM contacts
WHERE name LIKE ? OR remote_identity_hash LIKE ? OR lxmf_address LIKE ? OR lxst_address LIKE ?
"""Tb4b4b4,
Tb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff%Tffd700{Te6edf3searchTffd700}Ta5d6ff%Ta5d6ff"Tb4b4b4, Ta5d6fffTa5d6ff"Ta5d6ff%Tffd700{Te6edf3searchTffd700}Ta5d6ff%Ta5d6ff"Tb4b4b4, Ta5d6fffTa5d6ff"Ta5d6ff%Tffd700{Te6edf3searchTffd700}Ta5d6ff%Ta5d6ff"Tb4b4b4, Ta5d6fffTa5d6ff"Ta5d6ff%Tffd700{Te6edf3searchTffd700}Ta5d6ff%Ta5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3row Tff7b72= Tff7b72selfTff7b72.Td2a8ffproviderTff7b72.Td2a8fffetchoneTb4b4b4(Ta5d6ff"Ta5d6ffSELECT COUNT(*) as n FROM contactsTa5d6ff"Tb4b4b4)
Tff7b72return Te6edf3rowTb4b4b4[Ta5d6ff"Ta5d6ffnTa5d6ff"Tb4b4b4] Tff7b72if Te6edf3row Tff7b72else T79c0ff0

Tff7b72def Td2a8ffget_contactTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3contact_idTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffproviderTff7b72.Td2a8fffetchoneTb4b4b4(
Ta5d6ff"Ta5d6ffSELECT * FROM contacts WHERE id = ?Ta5d6ff"Tb4b4b4,
Tb4b4b4(Te6edf3contact_idTb4b4b4,Tb4b4b4)Tb4b4b4,
Tb4b4b4)

Tff7b72def Td2a8ffupdate_contactTb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3contact_idTb4b4b4,
Te6edf3nameTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3remote_identity_hashTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3lxmf_addressTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3lxst_addressTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3preferred_ringtone_idTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3custom_imageTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3clear_imageTff7b72=Tff7b72FalseTb4b4b4,
Te6edf3is_telemetry_trustedTff7b72=Tff7b72NoneTb4b4b4,
Tb4b4b4)Tb4b4b4:
Te6edf3updates Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3params Tff7b72= Tb4b4b4[Tb4b4b4]

Tff7b72if Te6edf3name Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3updatesTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Ta5d6ffname = ?Ta5d6ff"Tb4b4b4)
Te6edf3paramsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3nameTb4b4b4)
Tff7b72if Te6edf3remote_identity_hash Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3updatesTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Ta5d6ffremote_identity_hash = ?Ta5d6ff"Tb4b4b4)
Te6edf3paramsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3remote_identity_hashTb4b4b4)
Tff7b72if Te6edf3lxmf_address Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3updatesTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Ta5d6fflxmf_address = ?Ta5d6ff"Tb4b4b4)
Te6edf3paramsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3lxmf_addressTb4b4b4)
Tff7b72if Te6edf3lxst_address Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3updatesTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Ta5d6fflxst_address = ?Ta5d6ff"Tb4b4b4)
Te6edf3paramsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3lxst_addressTb4b4b4)
Tff7b72if Te6edf3preferred_ringtone_id Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3updatesTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Ta5d6ffpreferred_ringtone_id = ?Ta5d6ff"Tb4b4b4)
Te6edf3paramsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3preferred_ringtone_idTb4b4b4)
Tff7b72if Te6edf3is_telemetry_trusted Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3updatesTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Ta5d6ffis_telemetry_trusted = ?Ta5d6ff"Tb4b4b4)
Te6edf3paramsTff7b72.Td2a8ffappendTb4b4b4(T79c0ff1 Tff7b72if Te6edf3is_telemetry_trusted Tff7b72else T79c0ff0Tb4b4b4)
Tff7b72if Te6edf3clear_imageTb4b4b4:
Te6edf3updatesTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Ta5d6ffcustom_image = NULLTa5d6ff"Tb4b4b4)
Tff7b72elif Te6edf3custom_image Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3updatesTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Ta5d6ffcustom_image = ?Ta5d6ff"Tb4b4b4)
Te6edf3paramsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3custom_imageTb4b4b4)

Tff7b72if Tff7b72not Te6edf3updatesTb4b4b4:
Tff7b72return

Te6edf3updatesTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Ta5d6ffupdated_at = CURRENT_TIMESTAMPTa5d6ff"Tb4b4b4)
Te6edf3query Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ffUPDATE contacts SET Tffd700{Ta5d6ff'Ta5d6ff, Ta5d6ff'Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3updatesTb4b4b4)Tffd700}Ta5d6ff WHERE id = ?Ta5d6ff"
Te6edf3paramsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3contact_idTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffproviderTff7b72.Td2a8ffexecuteTb4b4b4(Te6edf3queryTb4b4b4, Tffa657tupleTb4b4b4(Te6edf3paramsTb4b4b4)Tb4b4b4)

Tff7b72def Td2a8ffdelete_contactTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3contact_idTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffproviderTff7b72.Td2a8ffexecuteTb4b4b4(Ta5d6ff"Ta5d6ffDELETE FROM contacts WHERE id = ?Ta5d6ff"Tb4b4b4, Tb4b4b4(Te6edf3contact_idTb4b4b4,Tb4b4b4)Tb4b4b4)

Tff7b72def Td2a8ffget_contact_by_identity_hashTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3remote_identity_hashTb4b4b4, Te6edf3related_hashesTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
T8b949e"""Match a contact by identity, LXMF, or LXST hash.

related_hashes may include derived destination hashes for the same
peer so callers that only know an identity hash still match contacts
that were saved with an LXMF or LXST destination hash as the primary key.
Matching is case-insensitive. Hex-only forms are also tried so UUID-style
separators still match stored RNS hashes.
"""
Tff7b72if Tff7b72not Te6edf3remote_identity_hash Tff7b72and Tff7b72not Te6edf3related_hashesTb4b4b4:
Tff7b72return Tff7b72None

Te6edf3candidates Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3value Tff7b72in Tb4b4b4(Te6edf3remote_identity_hashTb4b4b4, Tff7b72*Tb4b4b4(Te6edf3related_hashes Tff7b72or Tb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3value Tff7b72or Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3valueTb4b4b4, Tffa657strTb4b4b4)Tb4b4b4:
Tff7b72continue
Te6edf3lowered Tff7b72= Te6edf3valueTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3lowered Tff7b72and Te6edf3lowered Tff7b72not Tff7b72in Te6edf3candidatesTb4b4b4:
Te6edf3candidatesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3loweredTb4b4b4)
Te6edf3hex_only Tff7b72= Ta5d6ff"Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3c Tff7b72for Te6edf3c Tff7b72in Te6edf3lowered Tff7b72if Te6edf3c Tff7b72in Ta5d6ff"Ta5d6ff0123456789abcdefTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3hex_only Tff7b72and Te6edf3hex_only Tff7b72not Tff7b72in Te6edf3candidatesTb4b4b4:
Te6edf3candidatesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3hex_onlyTb4b4b4)
Tff7b72if Tff7b72not Te6edf3candidatesTb4b4b4:
Tff7b72return Tff7b72None

Te6edf3placeholders Tff7b72= Ta5d6ff"Ta5d6ff, Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Ta5d6ff"Ta5d6ff?Ta5d6ff" Tff7b72for Te6edf3_ Tff7b72in Te6edf3candidatesTb4b4b4)
Tff7b72return Tff7b72selfTff7b72.Td2a8ffproviderTff7b72.Td2a8fffetchoneTb4b4b4(
Ta5d6fffTa5d6ff"""
Ta5d6ff SELECT * FROM contacts
Ta5d6ff WHERE lower(remote_identity_hash) IN (Tffd700{Te6edf3placeholdersTffd700}Ta5d6ff)
Ta5d6ff OR lower(lxmf_address) IN (Tffd700{Te6edf3placeholdersTffd700}Ta5d6ff)
Ta5d6ff OR lower(lxst_address) IN (Tffd700{Te6edf3placeholdersTffd700}Ta5d6ff)
Ta5d6ff Ta5d6ff"""Tb4b4b4,
Tffa657tupleTb4b4b4(Te6edf3candidatesTb4b4b4) Tff7b72* T79c0ff3Tb4b4b4,
Tb4b4b4)


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────